上一篇已經稍微介紹過符號與字串的差別了,但是那才是剛開始。
本篇會在繼續告訴大家關於符號的小東西。
直接開門見山的說了,字串的效能要比符號來的差一點。
那要怎麼驗證呢?我們可以使用 object_id
。
當使用 object_id
去印出該物件在Ruby中唯一的數字編號。
但注意在不同的電腦或是 Ruby
版本會有不同的結果。
先來看 Symbol 會長出什麼出來:
5.times do
puts :hello.object_id
end
會產生5組一模一樣的數字。
1020188
1020188
1020188
1020188
1020188
而這些數字代表著什麼意義呢?
事實上它代表的是一個記憶體位址。
可以看到每次定義符號後,都會產生相同的數字,代表著這些 Symbol 其實都是同一個東西,並不會重新生一份新的出來,直接跟記憶體要就好了。
你就算要了100次,它只要跟記憶體拿100次同樣的東西就好,所以它可以省記憶體空間。
但字串就不一樣了,先來看會發生什麼事?
5.times do
puts "hello".object_id
end
會產生五組不同的數字。
60
80
100
120
140
每次字串在生成一個新的字串時,他都會跟記憶體要一些空間。
假如你要了100次,記憶體就要吐100個空間給它。
所以你覺得誰的效能比較好呢?
其實我也可以使用freeze
去將字串冷凍起來,效果會像這樣:
5.times do
puts "hello".freeze.object_id
end
60
60
60
60
60
這樣就可以把ID固定住,並產生跟符號一樣的效果。
其實 Ruby 分別在字串與符號類別提供了一些轉換的方法。
字串換符號:
# 常見
p "kitty".to_sym # => :kitty
# 少見
p "kitty".intern # => :kitty
# 這也可以用
p %s(kitty) # => :kitty
符號換字串:
# 常見
p :kitty.to_s # => "kitty"
# 少見
p "kitty".id2name # => "kitty"
這時候你應該會產生什麼時候用符號?什麼時候用字串?的疑問。
Hash 中的 Key:
user = {name: "Kitty", age: 20, gender: "Female"}
p user # => {:name=>"Kitty", :age=>20, :gender=>"Female"}
這時候就非常適合使用 Symbol ,我們可以利用它不可變的特性,以及它的效能又比字串來得好,查找跟比較也比字串快,很適合當作 Hash 中的 Key
。
如果你的資料變更或是你只是想單純印出東西,那就可以使用字串。
因為當你將 Symbol 輸出的時,它會先轉型成字串在輸出,所以效能就會差一點點。
字串有很多好用的功能, Symbol 類別就沒這麼豐富。
參考資料: